﻿2026-05-14T11:35:02.1528311Z ##[group]Run pnpm verify:phase-4
2026-05-14T11:35:02.1528646Z [36;1mpnpm verify:phase-4[0m
2026-05-14T11:35:02.1561553Z shell: /usr/bin/bash -e {0}
2026-05-14T11:35:02.1561803Z env:
2026-05-14T11:35:02.1562220Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-14T11:35:02.1562537Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-14T11:35:02.1562759Z   SKIP_TRACE_CHECK: 1
2026-05-14T11:35:02.1562975Z ##[endgroup]
2026-05-14T11:35:02.4672234Z 
2026-05-14T11:35:02.4673020Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-14T11:35:02.4673812Z > node scripts/verify-phase-4.mjs
2026-05-14T11:35:02.4674157Z 
2026-05-14T11:35:02.4986286Z 
2026-05-14T11:35:02.4987293Z === Workspace: typecheck ===
2026-05-14T11:35:02.4988198Z >>> pnpm -r typecheck
2026-05-14T11:35:02.8603037Z Scope: 5 of 6 workspace projects
2026-05-14T11:35:02.8662232Z packages/db typecheck$ tsc --noEmit
2026-05-14T11:35:02.8671666Z packages/game-logic typecheck$ tsc --noEmit
2026-05-14T11:35:05.5098747Z packages/game-logic typecheck: Done
2026-05-14T11:35:05.5116939Z packages/protocol typecheck$ tsc --noEmit
2026-05-14T11:35:07.7973615Z packages/db typecheck: Done
2026-05-14T11:35:09.0664996Z packages/protocol typecheck: Done
2026-05-14T11:35:09.0672431Z apps/server typecheck$ tsc --noEmit
2026-05-14T11:35:09.0675821Z apps/client typecheck$ tsc --noEmit
2026-05-14T11:35:20.6368901Z apps/client typecheck: Done
2026-05-14T11:35:21.6959694Z apps/server typecheck: Done
2026-05-14T11:35:21.7055262Z 
2026-05-14T11:35:21.7055773Z === Lint: protocol-sync ===
2026-05-14T11:35:21.7056900Z >>> pnpm lint:protocol-sync
2026-05-14T11:35:22.0096522Z 
2026-05-14T11:35:22.0097584Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-14T11:35:22.0098775Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-14T11:35:22.0099457Z 
2026-05-14T11:35:22.0393944Z lint-protocol-sync: OK
2026-05-14T11:35:22.0508723Z 
2026-05-14T11:35:22.0509353Z === Lint: game-logic-purity ===
2026-05-14T11:35:22.0510228Z >>> pnpm lint:game-logic-purity
2026-05-14T11:35:22.3584652Z 
2026-05-14T11:35:22.3585734Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-14T11:35:22.3587262Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-14T11:35:22.3588007Z 
2026-05-14T11:35:22.3921512Z lint-game-logic-purity: OK (7 file(s) clean)
2026-05-14T11:35:22.4037013Z 
2026-05-14T11:35:22.4037708Z === Lint: better-auth-schema-sync ===
2026-05-14T11:35:22.4038643Z >>> pnpm lint:better-auth-schema-sync
2026-05-14T11:35:22.7184104Z 
2026-05-14T11:35:22.7185180Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-14T11:35:22.7186751Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-14T11:35:22.7187389Z 
2026-05-14T11:35:24.3774215Z lint-better-auth-schema-sync: OK
2026-05-14T11:35:24.3895079Z 
2026-05-14T11:35:24.3895806Z === Lint: rate-limit-budgets ===
2026-05-14T11:35:24.3897556Z >>> pnpm lint:rate-limit-budgets
2026-05-14T11:35:24.6970590Z 
2026-05-14T11:35:24.6973528Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-14T11:35:24.6976735Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-14T11:35:24.6977164Z 
2026-05-14T11:35:24.7284628Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-14T11:35:24.7415179Z 
2026-05-14T11:35:24.7415872Z === Lint: no-clipboard-rce ===
2026-05-14T11:35:24.7416915Z >>> pnpm lint:no-clipboard-rce
2026-05-14T11:35:25.0454826Z 
2026-05-14T11:35:25.0460128Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-14T11:35:25.0461686Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-14T11:35:25.0462338Z 
2026-05-14T11:35:25.0790730Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-14T11:35:25.0922634Z 
2026-05-14T11:35:25.0923363Z === Lint: room-layout ===
2026-05-14T11:35:25.0924495Z >>> pnpm lint:room-layout
2026-05-14T11:35:25.4003893Z 
2026-05-14T11:35:25.4008959Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-14T11:35:25.4016998Z > node tools/scripts/lint-room-layout.mjs
2026-05-14T11:35:25.4018116Z 
2026-05-14T11:35:25.4351462Z lint-room-layout: OK
2026-05-14T11:35:25.4466574Z 
2026-05-14T11:35:25.4468397Z === ADR 0004 lint ===
2026-05-14T11:35:25.4469518Z >>> pnpm lint:adr:0004
2026-05-14T11:35:25.7537995Z 
2026-05-14T11:35:25.7538902Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-14T11:35:25.7542034Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-14T11:35:25.7542749Z 
2026-05-14T11:35:25.7825018Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T11:35:25.7938199Z 
2026-05-14T11:35:25.7943217Z === Drizzle: emit-check ===
2026-05-14T11:35:25.7943902Z >>> pnpm db:emit-check
2026-05-14T11:35:26.0994630Z 
2026-05-14T11:35:26.0995586Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-14T11:35:26.0998791Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-14T11:35:26.1000972Z 
2026-05-14T11:35:26.5513139Z No config path provided, using default 'drizzle.config.ts'
2026-05-14T11:35:26.5515561Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-14T11:35:26.9942461Z 8 tables
2026-05-14T11:35:26.9943336Z accounts 8 columns 1 indexes 0 fks
2026-05-14T11:35:26.9944235Z audit_log 6 columns 0 indexes 2 fks
2026-05-14T11:35:26.9945063Z characters 9 columns 0 indexes 1 fks
2026-05-14T11:35:26.9945958Z inventory_items 4 columns 0 indexes 1 fks
2026-05-14T11:35:26.9947155Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-14T11:35:26.9948133Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-14T11:35:26.9949065Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-14T11:35:26.9949932Z sessions 5 columns 0 indexes 1 fks
2026-05-14T11:35:26.9950466Z 
2026-05-14T11:35:26.9951303Z No schema changes, nothing to migrate 😴
2026-05-14T11:35:27.6558749Z 
2026-05-14T11:35:27.6559529Z === Drizzle: schema-sync ===
2026-05-14T11:35:27.6560328Z >>> pnpm lint:schema-sync
2026-05-14T11:35:27.9620374Z 
2026-05-14T11:35:27.9621416Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-14T11:35:27.9625046Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-14T11:35:27.9627858Z 
2026-05-14T11:35:27.9877370Z OK
2026-05-14T11:35:27.9996877Z 
2026-05-14T11:35:27.9997460Z === Drizzle: source-comments ===
2026-05-14T11:35:27.9998430Z >>> pnpm lint:source-comments
2026-05-14T11:35:28.3043389Z 
2026-05-14T11:35:28.3044408Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-14T11:35:28.3045684Z > pnpm -C packages/db run lint:source-comments
2026-05-14T11:35:28.3046631Z 
2026-05-14T11:35:28.6112026Z 
2026-05-14T11:35:28.6113167Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-14T11:35:28.6114481Z > node scripts/check-source-comments.mjs
2026-05-14T11:35:28.6115133Z 
2026-05-14T11:35:28.6418269Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-14T11:35:28.6621355Z 
2026-05-14T11:35:28.6622212Z === Workspace: test ===
2026-05-14T11:35:28.6622910Z >>> pnpm -r test
2026-05-14T11:35:28.9748643Z Scope: 5 of 6 workspace projects
2026-05-14T11:35:28.9805185Z packages/db test$ vitest run
2026-05-14T11:35:28.9814181Z packages/game-logic test$ vitest run
2026-05-14T11:35:29.4885866Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-14T11:35:29.4917669Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-14T11:35:29.9408663Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T11:35:30.1643701Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:35:30.3980059Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T11:35:30.5079564Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T11:35:30.6484878Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:35:30.7553160Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:35:30.8781561Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:35:31.1108536Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:35:31.3455106Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-14T11:35:31.5634859Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:35:31.5732852Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T11:35:31.5816844Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-14T11:35:31.5823021Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-14T11:35:31.5838053Z packages/db test: [2m   Start at [22m 11:35:29
2026-05-14T11:35:31.5839634Z packages/db test: [2m   Duration [22m 2.08s[2m (transform 167ms, setup 0ms, import 1.43s, tests 32ms, environment 1ms)[22m
2026-05-14T11:35:31.6088122Z packages/db test: Done
2026-05-14T11:35:31.6106857Z packages/protocol test$ vitest run
2026-05-14T11:35:31.7968124Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:35:32.0208159Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:35:32.0305410Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-14T11:35:32.0350408Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-14T11:35:32.0351873Z packages/game-logic test: [2m   Start at [22m 11:35:29
2026-05-14T11:35:32.0354232Z packages/game-logic test: [2m   Duration [22m 2.53s[2m (transform 257ms, setup 0ms, import 463ms, tests 88ms, environment 2ms)[22m
2026-05-14T11:35:32.0830738Z packages/game-logic test: Done
2026-05-14T11:35:32.1375937Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-14T11:35:32.4268073Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T11:35:32.5861168Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:35:32.7467735Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:35:32.9014835Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:35:32.9065937Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-14T11:35:32.9073240Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-14T11:35:32.9081784Z packages/protocol test: [2m   Start at [22m 11:35:32
2026-05-14T11:35:32.9083637Z packages/protocol test: [2m   Duration [22m 760ms[2m (transform 112ms, setup 0ms, import 218ms, tests 31ms, environment 0ms)[22m
2026-05-14T11:35:32.9350872Z packages/protocol test: Done
2026-05-14T11:35:32.9355053Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-14T11:35:32.9358408Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-14T11:35:33.4796697Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-14T11:35:33.5414174Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-14T11:35:34.5884449Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 61[2mms[22m[39m
2026-05-14T11:35:34.9459891Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T11:35:35.3159588Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 27[2mms[22m[39m
2026-05-14T11:35:35.5622077Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-14T11:35:35.5624955Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-14T11:35:35.5850102Z apps/server test: {"level":40,"time":1778758535583,"pid":3312,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T11:35:35.5901894Z apps/server test: {"level":40,"time":1778758535586,"pid":3312,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T11:35:35.5904339Z apps/server test: {"level":40,"time":1778758535586,"pid":3312,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T11:35:35.5907476Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T11:35:35.6175523Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 248[2mms[22m[39m
2026-05-14T11:35:36.5367638Z apps/server test: {"level":30,"time":1778758536515,"pid":3323,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-14T11:35:36.5370373Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 711[2mms[22m[39m
2026-05-14T11:35:36.5372298Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 613[2mms[22m[39m
2026-05-14T11:35:36.8188565Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 90[2mms[22m[39m
2026-05-14T11:35:37.4058941Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-14T11:35:37.4097606Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-LXaVG7/rebno.db
2026-05-14T11:35:37.4108772Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:35:37.4110371Z apps/server test: [run-migrations] OK
2026-05-14T11:35:37.4211876Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-14T11:35:37.4220213Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-tStHP7/rebno.db
2026-05-14T11:35:37.4221870Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:35:37.4224828Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-14T11:35:37.4226831Z apps/server test: [run-migrations] OK
2026-05-14T11:35:37.4318146Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T11:35:37.4323815Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-1cZdnm/rebno.db
2026-05-14T11:35:37.4330800Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:35:37.4332057Z apps/server test: [run-migrations] OK
2026-05-14T11:35:37.4335603Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T11:35:37.4358374Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-1cZdnm/rebno.db
2026-05-14T11:35:37.4375452Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T11:35:37.4406803Z apps/server test: [run-migrations] OK
2026-05-14T11:35:37.4414669Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 55[2mms[22m[39m
2026-05-14T11:35:37.7538579Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-14T11:35:37.8808814Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T11:35:38.0114078Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T11:35:38.2988149Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-14T11:35:38.5158495Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:35:39.1349526Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T11:35:39.3641815Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-14T11:35:39.3651506Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌁ auth for agents [www.vestauth.com]
2026-05-14T11:35:39.3653225Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-14T11:35:40.1361641Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:35:40.1453023Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-14T11:35:40.1497403Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-14T11:35:40.1499102Z apps/server test: [2m   Start at [22m 11:35:33
2026-05-14T11:35:40.1513219Z apps/server test: [2m   Duration [22m 6.65s[2m (transform 489ms, setup 0ms, import 3.42s, tests 948ms, environment 2ms)[22m
2026-05-14T11:35:40.1801156Z apps/server test: Done
2026-05-14T11:35:40.2837196Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T11:35:40.9740863Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T11:35:41.6554729Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T11:35:42.4000095Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 70[2mms[22m[39m
2026-05-14T11:35:43.1531577Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 90[2mms[22m[39m
2026-05-14T11:35:43.8594026Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-14T11:35:44.5902854Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 75[2mms[22m[39m
2026-05-14T11:35:45.3309479Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 77[2mms[22m[39m
2026-05-14T11:35:46.0129617Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:35:46.7472860Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 79[2mms[22m[39m
2026-05-14T11:35:47.4210006Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:35:48.0998422Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:35:48.7567701Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:35:49.4267996Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T11:35:50.1091664Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:35:50.7888758Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:35:51.4713965Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T11:35:52.1218516Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T11:35:52.7890112Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:35:53.4748794Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T11:35:54.1449116Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T11:35:54.8300117Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T11:35:54.8536991Z apps/client test: [2m Test Files [22m [1m[32m26 passed[39m[22m[90m (26)[39m
2026-05-14T11:35:54.8542358Z apps/client test: [2m      Tests [22m [1m[32m193 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (197)[39m
2026-05-14T11:35:54.8543427Z apps/client test: [2m   Start at [22m 11:35:33
2026-05-14T11:35:54.8544975Z apps/client test: [2m   Duration [22m 21.31s[2m (transform 859ms, setup 59ms, collect 1.33s, tests 919ms, environment 12.45s, prepare 2.41s)[22m
2026-05-14T11:35:54.9877852Z apps/client test: Done
2026-05-14T11:35:54.9957125Z 
2026-05-14T11:35:54.9957612Z verify-phase-4: OK (12 steps green)
